﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ПрограммныйИнтерфейс

// Разбивает строку на несколько строк по указанному разделителю. Разделитель может иметь любую длину.
// В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы,
// рекомендуется использовать функцию платформы СтрРазделить.
//
// Параметры:
//  Значение               - Строка - текст с разделителями.
//  Разделитель            - Строка - разделитель строк текста, минимум 1 символ.
//  ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
//    Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
//     > для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
//       включаются в результат;
//     > если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
//       случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
//       при других разделителях результатом функции будет пустой массив.
//  СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок.
//
// Возвращаемое значение:
//  Массив из Строка
//
// Пример:
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",")
//  - возвратит массив из 5 элементов, три из которых  - пустые: "", "один", "", "два", "";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина)
//  - возвратит массив из двух элементов: "один", "два";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(" один   два  ", " ")
//  - возвратит массив из двух элементов: "один", "два";
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("")
//  - возвратит пустой массив;
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("",,Ложь)
//  - возвратит массив с одним элементом: ""(пустая строка);
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("", " ")
//  - возвратит массив с одним элементом: "" (пустая строка).
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, 
	СокращатьНепечатаемыеСимволы = Ложь) Экспорт
	
	Если СтрДлина(Разделитель) = 1 
		И ПропускатьПустыеСтроки = Неопределено 
		И СокращатьНепечатаемыеСимволы Тогда 
		
		Результат = СтрРазделить(Значение, Разделитель, Ложь);
		Для Индекс = 0 По Результат.ВГраница() Цикл
			Результат[Индекс] = СокрЛП(Результат[Индекс])
		КонецЦикла;
		Возврат Результат;
		
	КонецЕсли;
	
	Результат = Новый Массив;
	
	// Для обеспечения обратной совместимости.
	Если ПропускатьПустыеСтроки = Неопределено Тогда
		ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
		Если ПустаяСтрока(Значение) Тогда 
			Если Разделитель = " " Тогда
				Результат.Добавить("");
			КонецЕсли;
			Возврат Результат;
		КонецЕсли;
	КонецЕсли;
	//
	
	Позиция = СтрНайти(Значение, Разделитель);
	Пока Позиция > 0 Цикл
		Подстрока = Лев(Значение, Позиция - 1);
		Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
			Если СокращатьНепечатаемыеСимволы Тогда
				Результат.Добавить(СокрЛП(Подстрока));
			Иначе
				Результат.Добавить(Подстрока);
			КонецЕсли;
		КонецЕсли;
		Значение = Сред(Значение, Позиция + СтрДлина(Разделитель));
		Позиция = СтрНайти(Значение, Разделитель);
	КонецЦикла;
	
	Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Значение) Тогда
		Если СокращатьНепечатаемыеСимволы Тогда
			Результат.Добавить(СокрЛП(Значение));
		Иначе
			Результат.Добавить(Значение);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции 

// Определяет, является ли символ разделителем.
//
// Параметры:
//  КодСимвола      - Число  - код проверяемого символа;
//  РазделителиСлов - Строка - символы разделителей. Если параметр не указан, то 
//                             разделителем считаются все символы, не являющиеся цифрами, 
//                             латинскими и кириллическими буквами, а также знаком подчеркивания.
//
// Возвращаемое значение:
//  Булево - Истина, если символ с кодом КодСимвола является разделителем.
//
Функция ЭтоРазделительСлов(КодСимвола, РазделителиСлов = Неопределено) Экспорт
	
	Если РазделителиСлов <> Неопределено Тогда
		Возврат СтрНайти(РазделителиСлов, Символ(КодСимвола)) > 0;
	КонецЕсли;
		
	Диапазоны = Новый Массив;
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 48, 57)); 		// цифры
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 65, 90)); 		// латиница большие
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 97, 122)); 		// латиница маленькие
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 1040, 1103)); 	// кириллица
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 1025, 1025)); 	// символ "Ё"
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 1105, 1105)); 	// символ "ё"
	Диапазоны.Добавить(Новый Структура("Мин,Макс", 95, 95)); 		// символ "_"
	
	Для Каждого Диапазон Из Диапазоны Цикл
		Если КодСимвола >= Диапазон.Мин И КодСимвола <= Диапазон.Макс Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

// Разбивает строку на несколько строк, используя заданный набор разделителей.
// Если параметр РазделителиСлов не задан, то разделителем слов считается любой из символов, 
// не относящихся к символам латиницы, кириллицы, цифры, подчеркивания.
//
// Параметры:
//  Значение        - Строка - исходная строка, которую необходимо разложить на слова.
//  РазделителиСлов - Строка - перечень символов-разделителей. Например, ".,;".
//
// Возвращаемое значение:
//  Массив - список слов.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три") возвратит массив значений: "один",
//  "два2_", "три"; СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три", "#@!_") возвратит массив
//  значений: "один-", "два2", "три".
//
Функция РазложитьСтрокуВМассивСлов(Знач Значение, РазделителиСлов = Неопределено) Экспорт
	
	Слова = Новый Массив;
	
	РазмерТекста = СтрДлина(Значение);
	НачалоСлова = 1;
	Для Позиция = 1 По РазмерТекста Цикл
		КодСимвола = КодСимвола(Значение, Позиция);
		Если ЭтоРазделительСлов(КодСимвола, РазделителиСлов) Тогда
			Если Позиция <> НачалоСлова Тогда
				Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова));
			КонецЕсли;
			НачалоСлова = Позиция + 1;
		КонецЕсли;
	КонецЦикла;
	
	Если Позиция <> НачалоСлова Тогда
		Слова.Добавить(Сред(Значение, НачалоСлова, Позиция - НачалоСлова));
	КонецЕсли;
	
	Возврат Слова;
	
КонецФункции

// Подставляет параметры в строку. Максимально возможное число параметров - 9.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров начинается с единицы.
//
// Параметры:
//  ШаблонСтроки  - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", 
//                           например "%1 пошел в %2");
//  Параметр1   - Строка - значение подставляемого параметра.
//  Параметр2   - Строка
//  Параметр3   - Строка
//  Параметр4   - Строка
//  Параметр5   - Строка
//  Параметр6   - Строка
//  Параметр7   - Строка
//  Параметр8   - Строка
//  Параметр9   - Строка
//
// Возвращаемое значение:
//  Строка   - текстовая строка с подставленными параметрами.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='%1 пошел в %2'"), "Вася", "Зоопарк") = "Вася пошел
//  в Зоопарк".
//
Функция ПодставитьПараметрыВСтроку(Знач ШаблонСтроки,
	Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
	Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
	Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено) Экспорт
	
	ЕстьПараметрыСПроцентом = СтрНайти(Параметр1, "%")
		Или СтрНайти(Параметр2, "%")
		Или СтрНайти(Параметр3, "%")
		Или СтрНайти(Параметр4, "%")
		Или СтрНайти(Параметр5, "%")
		Или СтрНайти(Параметр6, "%")
		Или СтрНайти(Параметр7, "%")
		Или СтрНайти(Параметр8, "%")
		Или СтрНайти(Параметр9, "%");
		
	Если ЕстьПараметрыСПроцентом Тогда
		Возврат ПодставитьПараметрыСПроцентом(ШаблонСтроки, Параметр1,
			Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7, Параметр8, Параметр9);
	КонецЕсли;
	
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%1", Параметр1);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%2", Параметр2);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%3", Параметр3);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%4", Параметр4);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%5", Параметр5);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%6", Параметр6);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%7", Параметр7);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%8", Параметр8);
	ШаблонСтроки = СтрЗаменить(ШаблонСтроки, "%9", Параметр9);
	Возврат ШаблонСтроки;
	
КонецФункции

// Подставляет параметры в строку. Число параметров в строке не ограничено.
// Параметры в строке задаются как %<номер параметра>. Нумерация параметров
// начинается с единицы.
//
// Параметры:
//  ШаблонСтроки  - Строка - шаблон строки с параметрами (вхождениями вида "%<номер параметра>", 
//                           например "%1 пошел в %2");
//  Параметры     - Массив - значения параметров в строке ШаблонСтроки.
//
// Возвращаемое значение:
//   Строка - строка с подставленными значениями параметрами.
//
// Пример:
//  ЗначенияПараметров = Новый Массив;
//  ЗначенияПараметров.Добавить("Вася");
//  ЗначенияПараметров.Добавить("Зоопарк");
//  Результат = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(НСтр("ru='%1 пошел в %2'"), ЗначенияПараметров);
//  - вернет строку "Вася пошел в Зоопарк".
//
Функция ПодставитьПараметрыВСтрокуИзМассива(Знач ШаблонСтроки, Знач Параметры) Экспорт
	
	СтрокаРезультата = ШаблонСтроки;
	
	Индекс = Параметры.Количество();
	Пока Индекс > 0 Цикл
		Значение = Параметры[Индекс-1];
		Если Не ПустаяСтрока(Значение) Тогда
			СтрокаРезультата = СтрЗаменить(СтрокаРезультата, "%" + Формат(Индекс, "ЧГ="), Значение);
		КонецЕсли;
		Индекс = Индекс - 1;
	КонецЦикла;
	
	Возврат СтрокаРезультата;
	
КонецФункции

// Заменяет в шаблоне строки имена параметров на их значения. Параметры в строке выделяются с двух сторон квадратными
// скобками.
//
// Параметры:
//  ШаблонСтроки - Строка    - строка, в которую необходимо вставить значения.
//  Параметры    - Структура - подставляемые значения параметров, где ключ - имя параметра без спецсимволов,
//                             значение - вставляемое значение.
//
// Возвращаемое значение:
//  Строка - строка со вставленными значениями.
//
// Пример:
//  Значения = Новый Структура("Фамилия,Имя", "Пупкин", "Вася");
//  Результат = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку("Здравствуй, [Имя] [Фамилия].", Значения);
//  - возвращает: "Здравствуй, Вася Пупкин".
//
Функция ВставитьПараметрыВСтроку(Знач ШаблонСтроки, Знач Параметры) Экспорт
	Результат = ШаблонСтроки;
	Для Каждого Параметр Из Параметры Цикл
		Результат = СтрЗаменить(Результат, "[" + Параметр.Ключ + "]", Параметр.Значение);
	КонецЦикла;
	Возврат Результат;
КонецФункции

// Получает значения параметров из строки.
//
// Параметры:
//  СтрокаПараметров - Строка - строка, содержащая параметры, каждый из которых представляет собой
//                              фрагмент вида <Имя параметра>=<Значение>, где:
//                                Имя параметра - имя параметра; 
//                                Значение - его значение. 
//                              Фрагменты отделяются друг от друга символами ';'.
//                              Если значение содержит пробельные символы, то оно должно быть заключено в двойные
//                              кавычки (").
//                              Например:
//                               "File=""c:\InfoBases\Trade""; Usr=""Director"";"
//  Разделитель - Строка - символ, которым фрагменты отделяются друг от друга.
//
// Возвращаемое значение:
//  Структура - значения параметров, где ключ - имя параметра, значение - значение параметра.
//
// Пример:
//  Результат = СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки("File=""c:\InfoBases\Trade""; Usr=""Director"";""", ";");
//  - вернет структуру:
//     ключ "File" и значение "c:\InfoBases\Trade"
//     ключ "Usr"  и значение "Director".
//
Функция ПараметрыИзСтроки(Знач СтрокаПараметров, Знач Разделитель = ";") Экспорт
	Результат = Новый Структура;
	
	ОписаниеПараметра = "";
	НайденоНачалоСтроки = Ложь;
	НомерПоследнегоСимвола = СтрДлина(СтрокаПараметров);
	Для НомерСимвола = 1 По НомерПоследнегоСимвола Цикл
		Символ =Сред(СтрокаПараметров, НомерСимвола, 1);
		Если Символ = """" Тогда
			НайденоНачалоСтроки = Не НайденоНачалоСтроки;
		КонецЕсли;
		Если Символ <> Разделитель Или НайденоНачалоСтроки Тогда
			ОписаниеПараметра = ОписаниеПараметра + Символ;
		КонецЕсли;
		Если Символ = Разделитель И Не НайденоНачалоСтроки Или НомерСимвола = НомерПоследнегоСимвола Тогда
			Позиция = СтрНайти(ОписаниеПараметра, "=");
			Если Позиция > 0 Тогда
				ИмяПараметра = СокрЛП(Лев(ОписаниеПараметра, Позиция - 1));
				ЗначениеПараметра = СокрЛП(Сред(ОписаниеПараметра, Позиция + 1));
				ЗначениеПараметра = СократитьДвойныеКавычки(ЗначениеПараметра);
				Результат.Вставить(ИмяПараметра, ЗначениеПараметра);
			КонецЕсли;
			ОписаниеПараметра = "";
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
КонецФункции

// Проверяет, содержит ли строка только цифры.
//
// Параметры:
//  Значение         - Строка - проверяемая строка.
//  Устаревший       - Булево - устаревший параметр, не используется.
//  ПробелыЗапрещены - Булево - если Ложь, то в строке допустимо наличие пробелов.
//
// Возвращаемое значение:
//   Булево - Истина - строка содержит только цифры или пустая, Ложь - строка содержит иные символы.
//
// Пример:
//  Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("0123"); // Истина
//  Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("0123abc"); // Ложь
//  Результат = СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке("01 2 3",, Ложь); // Истина
//
Функция ТолькоЦифрыВСтроке(Знач Значение, Знач Устаревший = Истина, Знач ПробелыЗапрещены = Истина) Экспорт
	
	Если ТипЗнч(Значение) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если Не ПробелыЗапрещены Тогда
		Значение = СтрЗаменить(Значение, " ", "");
	КонецЕсли;
		
	Если СтрДлина(Значение) = 0 Тогда
		Возврат Истина;
	КонецЕсли;
	
	// Если содержит только цифры, то в результате замен должна быть получена пустая строка.
	// Проверять при помощи ПустаяСтрока нельзя, так как в исходной строке могут быть пробельные символы.
	Возврат СтрДлина(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить(
		СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( СтрЗаменить( 
			Значение, "0", ""), "1", ""), "2", ""), "3", ""), "4", ""), "5", ""), "6", ""), "7", ""), "8", ""), "9", "")) = 0;
	
КонецФункции

// Проверяет, содержит ли строка только символы латинского алфавита.
//
// Параметры:
//  СтрокаПроверки - Строка - проверяемая строка.
//  УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
//  ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме латиницы.
//
// Возвращаемое значение:
//  Булево - Истина, если строка содержит только латинские (или допустимые) символы;
//           Ложь, если строка содержит иные символы.
//
Функция ТолькоЛатиницаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт
	
	Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
		Возврат Истина;
	КонецЕсли;
	
	КодыДопустимыхСимволов = Новый Массив;
	
	Для Индекс = 1 По СтрДлина(ДопустимыеСимволы) Цикл
		КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, Индекс, 1)));
	КонецЦикла;
	
	Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл
		КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1));
		Если ((КодСимвола < 65) Или (КодСимвола > 90 И КодСимвола < 97) Или (КодСимвола > 122))
			И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено) 
			И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

// Удаляет двойные кавычки с начала и конца строки, если они есть.
//
// Параметры:
//  Значение - Строка - входная строка.
//
// Возвращаемое значение:
//  Строка - строка без двойных кавычек.
// 
Функция СократитьДвойныеКавычки(Знач Значение) Экспорт
	
	Пока СтрНачинаетсяС(Значение, """") Цикл
		Значение = Сред(Значение, 2); 
	КонецЦикла; 
	
	Пока СтрЗаканчиваетсяНа(Значение, """") Цикл
		Значение = Лев(Значение, СтрДлина(Значение) - 1);
	КонецЦикла;
	
	Возврат Значение;
	
КонецФункции 

// Удаляет из строки указанное количество символов справа.
//
// Параметры:
//  Текст         - Строка - строка, в которой необходимо удалить последние символы;
//  ЧислоСимволов - Число  - количество удаляемых символов.
//
Процедура УдалитьПоследнийСимволВСтроке(Текст, ЧислоСимволов = 1) Экспорт
	
	Текст = Лев(Текст, СтрДлина(Текст) - ЧислоСимволов);
	
КонецПроцедуры 

// Проверяет, является ли строка уникальным идентификатором.
// В качестве уникального идентификатора предполагается строка вида
// "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", где X = [0..9,a..f].
//
// Параметры:
//  Значение - Строка - проверяемая строка.
//
// Возвращаемое значение:
//  Булево - Истина, если переданная строка является уникальным идентификатором.
//
Функция ЭтоУникальныйИдентификатор(Знач Значение) Экспорт
	
	Шаблон = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
	
	Если СтрДлина(Шаблон) <> СтрДлина(Значение) Тогда
		Возврат Ложь;
	КонецЕсли;
	Для Позиция = 1 По СтрДлина(Значение) Цикл
		Если КодСимвола(Шаблон, Позиция) = 88 // X
			И ((КодСимвола(Значение, Позиция) < 48 Или КодСимвола(Значение, Позиция) > 57) // 0..9
			И (КодСимвола(Значение, Позиция) < 97 Или КодСимвола(Значение, Позиция) > 102) // a..f
			И (КодСимвола(Значение, Позиция) < 65 Или КодСимвола(Значение, Позиция) > 70)) // A..F
			Или КодСимвола(Шаблон, Позиция) = 45 И КодСимвола(Значение, Позиция) <> 45 Тогда // -
				Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;

КонецФункции

// Формирует строку повторяющихся символов заданной длины.
//
// Параметры:
//  Символ      - Строка - символ, из которого будет формироваться строка.
//  ДлинаСтроки - Число  - требуемая длина результирующей строки.
//
// Возвращаемое значение:
//  Строка - строка, состоящая из повторяющихся символов.
//
Функция СформироватьСтрокуСимволов(Знач Символ, Знач ДлинаСтроки) Экспорт
	
	Результат = "";
	Для Счетчик = 1 По ДлинаСтроки Цикл
		Результат = Результат + Символ;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// Дополняет строку символами слева или справа до заданной длины и возвращает ее.
// При этом удаляются незначащие символы слева и справа (подробнее про незначащие символы 
// см. синтакс-помощник к методу платформы СокрЛП). 
// По умолчанию функция дополняет строку символами "0" (ноль) слева.
//
// Параметры:
//  Значение    - Строка - исходная строка, которую необходимо дополнить символами;
//  ДлинаСтроки - Число  - требуемая результирующая длина строки;
//  Символ      - Строка - символ, которым необходимо дополнить строку;
//  Режим       - Строка - "Слева" или "Справа" - вариант добавления символов к исходной строке.
// 
// Возвращаемое значение:
//  Строка - строка, дополненная символами.
//
// Пример:
//  1. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку("1234", 10, "0", "Слева");
//  Возвращает: "0000001234".
//
//  2. Результат = СтроковыеФункцииКлиентСервер.ДополнитьСтроку(" 1234  ", 10, "#", "Справа");
//  Строка = " 1234  "; ДлинаСтроки = 10; Символ = "#"; Режим = "Справа"
//  Возвращает: "1234######".
//
Функция ДополнитьСтроку(Знач Значение, Знач ДлинаСтроки, Знач Символ = "0", Знач Режим = "Слева") Экспорт
	
	// Длина символа не должна превышать единицы.
	Символ = Лев(Символ, 1);
	
	// Удаляем крайние пробелы слева и справа строки.
	Значение = СокрЛП(Значение);
	КоличествоСимволовНадоДобавить = ДлинаСтроки - СтрДлина(Значение);
	
	Если КоличествоСимволовНадоДобавить > 0 Тогда
		
		СтрокаДляДобавления = СформироватьСтрокуСимволов(Символ, КоличествоСимволовНадоДобавить);
		Если ВРег(Режим) = "СЛЕВА" Тогда
			Значение = СтрокаДляДобавления + Значение;
		ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
			Значение = Значение + СтрокаДляДобавления;
		КонецЕсли;
		
	КонецЕсли;
	
	Возврат Значение;
	
КонецФункции

// Удаляет крайние повторяющиеся символы слева или справа в строке.
//
// Параметры:
//  Значение        - Строка - исходная строка, из которой необходимо удалить крайние повторяющиеся символы;
//  УдаляемыйСимвол - Строка - искомый символ для удаления;
//  Режим           - Строка - "Слева" или "Справа" - режим удаления символов в исходной строке.
//
// Возвращаемое значение:
//  Строка - обрезанная строка.
//
Функция УдалитьПовторяющиесяСимволы(Знач Значение, Знач УдаляемыйСимвол, Знач Режим = "Слева") Экспорт
	
	Если ВРег(Режим) = "СЛЕВА" Тогда
		Пока Лев(Значение, 1) = УдаляемыйСимвол Цикл
			Значение = Сред(Значение, 2);
		КонецЦикла;
	ИначеЕсли ВРег(Режим) = "СПРАВА" Тогда
		Пока Прав(Значение, 1) = УдаляемыйСимвол Цикл
			Значение = Лев(Значение, СтрДлина(Значение) - 1);
		КонецЦикла;
	КонецЕсли;
	
	Возврат Значение;
	
КонецФункции

// Выполняет замену символов в строке.
// Предназначена для простых случаев - например, для замены латиницы на похожие кириллические символы.
//
// Параметры:
//  ЗаменяемыеСимволы - Строка - строка символов, каждый из которых требует замены;
//  Значение          - Строка - исходная строка, в которой требуется замена символов;
//  СимволыЗамены     - Строка - строка символов, на каждый из которых нужно заменить символы параметра
//                               ЗаменяемыеСимволы.
// 
// Возвращаемое значение:
//  Строка - строка после замены символов.
//
Функция ЗаменитьОдниСимволыДругими(ЗаменяемыеСимволы, Значение, СимволыЗамены) Экспорт
	
	Результат = Значение;
	
	Для НомерСимвола = 1 По СтрДлина(ЗаменяемыеСимволы) Цикл
		Результат = СтрЗаменить(Результат, Сред(ЗаменяемыеСимволы, НомерСимвола, 1), Сред(СимволыЗамены, НомерСимвола, 1));
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

// Выполняет преобразование арабского числа в римское.
//
// Параметры:
//  АрабскоеЧисло - Число - число, целое, от 0 до 999;
//  ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу.
//
// Возвращаемое значение:
//  Строка - число в римской нотации.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВРимскуюНотацию(17) = "XVII".
//
Функция ПреобразоватьЧислоВРимскуюНотацию(АрабскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт
	
	РимскоеЧисло = "";
	АрабскоеЧисло = ДополнитьСтроку(АрабскоеЧисло, 3);
	
	Если ИспользоватьКириллицу Тогда
		c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 ="С"; c500 = "Д"; c1000 = "М";
		
	Иначе
		c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 ="C"; c500 = "D"; c1000 = "M";
		
	КонецЕсли;
	
	Единицы	= Число(Сред(АрабскоеЧисло, 3, 1));
	Десятки	= Число(Сред(АрабскоеЧисло, 2, 1));
	Сотни	= Число(Сред(АрабскоеЧисло, 1, 1));
	
	РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Сотни, c100, c500, c1000);
	РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Десятки, c10, c50, c100);
	РимскоеЧисло = РимскоеЧисло + ПреобразоватьЦифруВРимскуюНотацию(Единицы, c1, c5, c10);
	
	Возврат РимскоеЧисло;
	
КонецФункции 

// Выполняет преобразование римского числа в арабское.
//
// Параметры:
//  РимскоеЧисло - Строка - число, записанное римскими цифрами;
//  ИспользоватьКириллицу - Булево - использовать в качестве арабских цифр кириллицу или латиницу.
//
// Возвращаемое значение:
//  Число - преобразованное число.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ПреобразоватьЧислоВАрабскуюНотацию("XVII") = 17.
//
Функция ПреобразоватьЧислоВАрабскуюНотацию(РимскоеЧисло, ИспользоватьКириллицу = Истина) Экспорт
	
	АрабскоеЧисло = 0;
	
	Если ИспользоватьКириллицу Тогда
		c1 = "1"; c5 = "У"; c10 = "Х"; c50 = "Л"; c100 ="С"; c500 = "Д"; c1000 = "М";
	Иначе
		c1 = "I"; c5 = "V"; c10 = "X"; c50 = "L"; c100 ="C"; c500 = "D"; c1000 = "M";
	КонецЕсли;
	
	РимскоеЧисло = СокрЛП(РимскоеЧисло);
	ЧислоСимволов = СтрДлина(РимскоеЧисло);
	
	Для Сч = 1 По ЧислоСимволов Цикл
		Если Сред(РимскоеЧисло,Сч,1) = c1000 Тогда
			АрабскоеЧисло = АрабскоеЧисло+1000;
		ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c500 Тогда
			АрабскоеЧисло = АрабскоеЧисло+500;
		ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c100 Тогда
			Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c500) Или (Сред(РимскоеЧисло,Сч+1,1) = c1000)) Тогда
				АрабскоеЧисло = АрабскоеЧисло-100;
			Иначе
				АрабскоеЧисло = АрабскоеЧисло+100;
			КонецЕсли;
		ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c50 Тогда
			АрабскоеЧисло = АрабскоеЧисло+50;
		ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c10 Тогда
			Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c50) Или (Сред(РимскоеЧисло,Сч+1,1) = c100)) Тогда
				АрабскоеЧисло = АрабскоеЧисло-10;
			Иначе
				АрабскоеЧисло = АрабскоеЧисло+10;
			КонецЕсли;
		ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c5 Тогда
			АрабскоеЧисло = АрабскоеЧисло+5;
		ИначеЕсли Сред(РимскоеЧисло,Сч,1) = c1 Тогда
			Если (Сч < ЧислоСимволов) И ((Сред(РимскоеЧисло,Сч+1,1) = c5) Или (Сред(РимскоеЧисло,Сч+1,1) = c10)) Тогда
				АрабскоеЧисло = АрабскоеЧисло-1;
			Иначе
				АрабскоеЧисло = АрабскоеЧисло+1;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат АрабскоеЧисло;
	
КонецФункции 

// Очищает текст в формате HTML от тегов и возвращает неформатированный текст. 
//
// Параметры:
//  ИсходныйТекст - Строка - текст в формате HTML.
//
// Возвращаемое значение:
//  Строка - текст, очищенный от тегов, скриптов и заголовков.
//
Функция ИзвлечьТекстИзHTML(Знач ИсходныйТекст) Экспорт
	Результат = "";
	
	Текст = НРег(ИсходныйТекст);
	
	// отрезаем все что не body
	Позиция = СтрНайти(Текст, "<body");
	Если Позиция > 0 Тогда
		Текст = Сред(Текст, Позиция + 5);
		ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 5);
		Позиция = СтрНайти(Текст, ">");
		Если Позиция > 0 Тогда
			Текст = Сред(Текст, Позиция + 1);
			ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
		КонецЕсли;
	КонецЕсли;
	
	Позиция = СтрНайти(Текст, "</body>");
	Если Позиция > 0 Тогда
		Текст = Лев(Текст, Позиция - 1);
		ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1);
	КонецЕсли;
	
	// вырезаем скрипты
	Позиция = СтрНайти(Текст, "<script");
	Пока Позиция > 0 Цикл
		ПозицияЗакрывающегоТега = СтрНайти(Текст, "</script>");
		Если ПозицияЗакрывающегоТега = 0 Тогда
			// Не найден закрывающий тег - вырезаем оставшийся текст.
			ПозицияЗакрывающегоТега = СтрДлина(Текст);
		КонецЕсли;
		Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 9);
		ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 9);
		Позиция = СтрНайти(Текст, "<script");
	КонецЦикла;
	
	// вырезаем стили
	Позиция = СтрНайти(Текст, "<style");
	Пока Позиция > 0 Цикл
		ПозицияЗакрывающегоТега = СтрНайти(Текст, "</style>");
		Если ПозицияЗакрывающегоТега = 0 Тогда
			// Не найден закрывающий тег - вырезаем оставшийся текст.
			ПозицияЗакрывающегоТега = СтрДлина(Текст);
		КонецЕсли;
		Текст = Лев(Текст, Позиция - 1) + Сред(Текст, ПозицияЗакрывающегоТега + 8);
		ИсходныйТекст = Лев(ИсходныйТекст, Позиция - 1) + Сред(ИсходныйТекст, ПозицияЗакрывающегоТега + 8);
		Позиция = СтрНайти(Текст, "<style");
	КонецЦикла;
	
	// вырезаем все теги	
	Позиция = СтрНайти(Текст, "<");
	Пока Позиция > 0 Цикл
		Результат = Результат + Лев(ИсходныйТекст, Позиция-1);
		Текст = Сред(Текст, Позиция + 1);
		ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
		Позиция = СтрНайти(Текст, ">");
		Если Позиция > 0 Тогда
			Текст = Сред(Текст, Позиция + 1);
			ИсходныйТекст = Сред(ИсходныйТекст, Позиция + 1);
		КонецЕсли;
		Позиция = СтрНайти(Текст, "<");
	КонецЦикла;
	Результат = Результат + ИсходныйТекст;
	МассивСтрок = РазложитьСтрокуВМассивПодстрок(Результат, Символы.ПС, Истина, Истина);
	Возврат СокрЛП(СтрСоединить(МассивСтрок, Символы.ПС));
КонецФункции

// Преобразует исходную строку в число без вызова исключений.
//
// Параметры:
//   Значение - Строка - строка, которую необходимо привести к числу.
//                       Например, "10", "+10", "010", вернет 10;
//                                 "(10)", "-10",вернет -10;
//                                 "10,2", "10.2",вернет 10.2;
//                                 "000", " ", "",вернет 0;
//                                 "10текст", вернет Неопределено.
//
// Возвращаемое значение:
//   Число, Неопределено - полученное число, либо Неопределено, если строка не является числом.
//
Функция СтрокаВЧисло(Знач Значение) Экспорт
	
	Значение  = СтрЗаменить(Значение, " ", "");
	Если СтрНачинаетсяС(Значение, "(") Тогда
		Значение = СтрЗаменить(Значение, "(", "-");
		Значение = СтрЗаменить(Значение, ")", "");
	КонецЕсли;
	
	СтрокаБезНулей = СтрЗаменить(Значение, "0", "");
	Если ПустаяСтрока(СтрокаБезНулей) Или СтрокаБезНулей = "-" Тогда
		Возврат 0;
	КонецЕсли;
	
	ТипЧисло  = Новый ОписаниеТипов("Число");
	Результат = ТипЧисло.ПривестиЗначение(Значение);
	
	Возврат ?(Результат <> 0 И Не ПустаяСтрока(СтрокаБезНулей), Результат, Неопределено);
	
КонецФункции

// Преобразует исходную строку в дату. 
// Если дату не удалось распознать, то возвращается пустая дата (01.01.01 00:00:00).
//
// Параметры:
//  Значение - Строка - строка, которую необходимо привести к дате.
//                      Формат даты должен быть в виде "ДД.ММ.ГГГГ" или "ДД/ММ/ГГ" или "ДД-ММ-ГГ ЧЧ:ММ:CC",
//                      Например, "23.02.1980" или "23/02/80 09:15:45".
//  ЧастьДаты - ЧастиДаты - определяет допустимые части даты. По умолчанию, ЧастиДаты.Дата.
// 
// Возвращаемое значение:
//  Дата
//
Функция СтрокаВДату(Знач Значение, ЧастьДаты = Неопределено) Экспорт
	
	НаборЦифр = "1234567890";
	
	Если ТипЗнч(ЧастьДаты) <> Тип("ЧастиДаты") Тогда
		ЧастьДаты = ЧастиДаты.Дата;
	КонецЕсли;
	
	ПараметрыДаты = Новый КвалификаторыДаты(ЧастьДаты);
	ОписаниеТипаДата = Новый ОписаниеТипов("Дата",,, ПараметрыДаты);
	
	Значение = ВРег(СтрСоединить(СтрРазделить(СокрЛП(Значение), Символы.НПП + Символы.ПС + Символы.Таб), " "));
	Результат = ОписаниеТипаДата.ПривестиЗначение(Значение);
	
	Для НомерМесяца = 1 По 12 Цикл
		Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=ММММ")), Формат(НомерМесяца, "ЧЦ=2; ЧВН="));
		Значение = СтрЗаменить(Значение, ВРег(Формат(Дата(1, НомерМесяца, 2), "ДФ=MMM")), Формат(НомерМесяца, "ЧЦ=2; ЧВН="));
	КонецЦикла;
	
	МассивНеЦифр = СтрРазделить(Значение, НаборЦифр);
	Если МассивНеЦифр.Количество() < 2 Тогда
		Возврат Результат;
	КонецЕсли;
	
	ПозицияПервойЦифры = СтрДлина(МассивНеЦифр[0]);
	ПозицияПоследнейЦифры = СтрДлина(Значение) - СтрДлина(МассивНеЦифр[МассивНеЦифр.ВГраница()]);
	Значение = Сред(Значение, ПозицияПервойЦифры, ПозицияПоследнейЦифры - ПозицияПервойЦифры);
	Если ПустаяСтрока(Значение) Тогда
		Возврат Результат;
	КонецЕсли;
	
	ЗначениеМассивом = СтрРазделить(Значение, " ");
	Элемент = ЗначениеМассивом[ЗначениеМассивом.ВГраница()];
	Если ЗначениеМассивом.Количество() > 1 Тогда
		Если СтрДлина(Элемент) = 2 Или СтрДлина(Элемент) = 4 Тогда
			
			ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0;
			Если ЭтоТолькоЦифры Тогда
				ЗначениеДата = Значение;
				ЗначениеВремя = "";
			Иначе
				ЗначениеВремя = Элемент;
				ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница());
				ЗначениеДата = СтрСоединить(ЗначениеМассивом, " ");
			КонецЕсли;
		Иначе
			
			ЗначениеВремя = Элемент;
			ЗначениеМассивом.Удалить(ЗначениеМассивом.ВГраница());
			ЗначениеДата = СтрСоединить(ЗначениеМассивом, " ");
		КонецЕсли;
	Иначе
		
		ЭтоТолькоЦифры = СтрРазделить(Элемент, НаборЦифр, Ложь).Количество() = 0;
		Если ЭтоТолькоЦифры Тогда
			
			Результат = ОписаниеТипаДата.ПривестиЗначение(Элемент);
			Если Не ЗначениеЗаполнено(Результат) Тогда
				
				Если СтрДлина(Элемент) = 6 Тогда
				
					ПеревернутаяДата  = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2);
					Год = СтрокаВЧисло(Лев(ПеревернутаяДата, 2));
					Если Год <> Неопределено Тогда
						ПеревернутаяДата = ?(Год > 29, "19", "20") + ПеревернутаяДата;
						Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
					КонецЕсли;
					
				ИначеЕсли СтрДлина(Элемент) > 7 Тогда
					
					ПеревернутаяДата  = Сред(Элемент, 5) + Сред(Элемент, 3, 2) + Лев(Элемент, 2);
					Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
					
				КонецЕсли;
				
			КонецЕсли;
			
			Возврат Результат;
			
		ИначеЕсли СтрНайти(Элемент, ":") > 0 Тогда
			
			ЗначениеДата = "";
			ЗначениеВремя = Элемент;
		Иначе
			ЗначениеДата = Элемент;
			ЗначениеВремя = "";
		КонецЕсли;
	КонецЕсли;
	
	ОписаниеТипаЧисло = Новый ОписаниеТипов("Число");
	
	Если ЗначениеЗаполнено(ЗначениеДата) И ЧастьДаты <> ЧастиДаты.Время Тогда
		
		НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеДата, НаборЦифр, Ложь), "");
		ЗначениеДатаМассивом = СтрРазделить(ЗначениеДата, НаборРазделителей, Ложь);
		
		ЭтоТолькоЦифры = СтрРазделить(ЗначениеДата, НаборЦифр, Ложь).Количество() = 0;
		Если НЕ ЭтоТолькоЦифры Тогда
			
			Год   = 1;
			Месяц = 1;
			День  = 1;
			
			Если СтрДлина(ЗначениеДатаМассивом[0]) = 4 Тогда
				Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]);
				ГодВНачале = Истина;
			Иначе
				День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[0]);
				ГодВНачале = Ложь;
			КонецЕсли;
			
			Если ЗначениеДатаМассивом.Количество() = 2 Тогда
				Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);
			ИначеЕсли ЗначениеДатаМассивом.Количество() > 2 Тогда
				Месяц = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[1]);
				Если ГодВНачале Тогда
					День = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]);
				Иначе
					Год = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеДатаМассивом[2]);
				КонецЕсли;
			КонецЕсли;
			
			Если СтрДлина(Год) < 3 Тогда
				ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год);
				Год = ?(ГодЧислом < 30, 2000, 1900) + ГодЧислом;
			Иначе
				Год = ОписаниеТипаЧисло.ПривестиЗначение(Год);
			КонецЕсли;
			
			ЗначениеДата = Формат(Год, "ЧЦ=4; ЧН=0001; ЧВН=; ЧГ=0")
				+ Формат(Месяц, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0")
				+ Формат(День, "ЧЦ=2; ЧН=01; ЧВН=; ЧГ=0");
		Иначе
			
			Если СтрДлина(ЗначениеДата) = 6 Тогда
				
				Год = Прав(ЗначениеДата, 2);
				ГодЧислом = ОписаниеТипаЧисло.ПривестиЗначение(Год);
				ЗначениеДата = ?(ГодЧислом < 30, 2000, 1900) + Год + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2) ;
				
			ИначеЕсли СтрДлина(ЗначениеДата) = 8 Тогда
				
				Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата);
				
				Если Не ЗначениеЗаполнено(Результат) Тогда
					ПеревернутаяДата  = Сред(ЗначениеДата, 5) + Сред(ЗначениеДата, 3, 2) + Лев(ЗначениеДата, 2);
					Результат = ОписаниеТипаДата.ПривестиЗначение(ПеревернутаяДата);
					Если ЗначениеЗаполнено(Результат) Тогда
						ЗначениеДата = ПеревернутаяДата;
					КонецЕсли;
				КонецЕсли;
			
			КонецЕсли;
		КонецЕсли;
		
	Иначе
		ЗначениеДата = "00010101";
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ЗначениеВремя) И ЧастьДаты <> ЧастиДаты.Дата Тогда
		
		ЭтоТолькоЦифры = СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь).Количество() = 0;
		Если НЕ ЭтоТолькоЦифры Тогда
			
			НаборРазделителей = СтрСоединить(СтрРазделить(ЗначениеВремя, НаборЦифр, Ложь), "");
			ЗначениеВремяМассивом = СтрРазделить(ЗначениеВремя, НаборРазделителей, Ложь);
			
			Час     = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[0]);
			Минута  = 0;
			Секунда = 0;
			
			Если ЗначениеВремяМассивом.Количество() = 2 Тогда
				Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]);
			ИначеЕсли ЗначениеВремяМассивом.Количество() > 2 Тогда
				Минута = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[1]);
				Секунда = ОписаниеТипаЧисло.ПривестиЗначение(ЗначениеВремяМассивом[2]);
			КонецЕсли;
			
			ШаблонФормата = "ЧЦ=2; ЧН=00; ЧВН=; ЧГ=0";
			ЗначениеВремя = Формат(Час, ШаблонФормата)
				+ Формат(Минута, ШаблонФормата)
				+ Формат(Секунда, ШаблонФормата);
				
		КонецЕсли;
		
	Иначе
		ЗначениеВремя = "000000";
	КонецЕсли;
	
	Результат = ОписаниеТипаДата.ПривестиЗначение(ЗначениеДата + ЗначениеВремя);
	
	Возврат Результат;
	
КонецФункции

// Формирует представление числа для определенного языка и параметров числа.
//  Представление параметров:
//  ┌──────┬──────┬─────────────────┬────────────────┬───────────────────┬───────────────────────┬────────────────┐
//  │ Lang │ Zero │ One             │ Two            │ Few               │ Many                  │ Other          │
//  ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤
//  │ ru   │      │ XX1 / X11       │                │ XX2─XX4 / X12─X14 │ XX0, XX5─XX9, X11─X14 │ дробные        │
//  │ Card.│      │ остался %1 день │                │ осталось %1 дня   │ осталось %1 дней      │ осталось %1 дня│
//  │      │      │ вижу %1 рыбу    │                │ вижу %1─х рыб     │ вижу %5 рыб           │ вижу %1 рыбы   │
//  ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤
//  │ ru   │      │                 │                │                   │                       │ других нет     │
//  │ Ord. │      │                 │                │                   │                       │ %1─й день      │
//  ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤
//  │ en   │      │ для 1           │                │                   │                       │ остальное      │
//  │ Card.│      │ left %1 day     │                │                   │                       │ left %1 days   │
//  ├──────┼──────┼─────────────────┼────────────────┼───────────────────┼───────────────────────┼────────────────┤
//  │ en   │      │ XX1 / X11       │ XX2 / X12      │ XX3 / X13         │                       │ остальное      │
//  │ Ord. │      │ %1st day        │ %1nd day       │ %1rd day          │                       │ %1th day.      │
//  └──────┴──────┴─────────────────┴────────────────┴───────────────────┴───────────────────────┴────────────────┘
//  ┌──────┬───────────────────────────┐
//  │Card. │ Cardinal ─ Количественное;│
//  │ Ord. │ Ordinal  - Порядковое;    │
//  ├──────┼───────────────────────────┤
//  │   X  │ любая цифра;              │
//  │   /  │ кроме.                    │
//  └──────┴───────────────────────────┘
//
// Параметры:
//  Шаблон          - Строка - строка, содержит перечисленные через точку с запятой 6 форм строки
//                             для каждой категории числительного: 
//                             %1 обозначает позицию числа;
//  Число           - Число - число, которое будет подставлено в строку вместо параметра "%1".
//  Вид             - ВидЧисловогоЗначения - определяет вид числового значения, для которого формируется представление. 
//                                           Количественное (по умолчанию) или Порядковое.
//  ФорматнаяСтрока - Строка - строка параметров форматирования. См. аналогичный параметр в СтрокаСЧислом. 
//
// Возвращаемое значение:
//  Строка - представление строки числа в требуемой форме.
//
// Пример:
//
//  Строка = СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка(
//		НСтр("ru=';остался %1 день;;осталось %1 дня;осталось %1 дней;осталось %1 дня';
//		     |en=';%1 day left;;;;%1 days left'"), 
//		0.05,, "ЧДЦ=1");
// 
Функция СтрокаСЧисломДляЛюбогоЯзыка(Шаблон, Число, Вид = Неопределено, ФорматнаяСтрока = "ЧН=0;") Экспорт
	
	Если ПустаяСтрока(Шаблон) Тогда
		Возврат Формат(Число, ФорматнаяСтрока); 
	КонецЕсли;

	Если Вид = Неопределено Тогда
		Вид = ВидЧисловогоЗначения.Количественное;
	КонецЕсли;

	Возврат СтрокаСЧислом(Шаблон, Число, Вид, ФорматнаяСтрока);

КонецФункции

#Область УстаревшиеПроцедурыИФункции

// Устарела. Следует использовать см. СтроковыеФункции.ФорматированнаяСтрока
// или см. СтроковыеФункцииКлиент.ФорматированнаяСтрока.
//
// Форматирует строку в соответствии с заданным шаблоном.
// Возможные значения тегов в шаблоне:
// - <b> Строка </b> - выделяет строку жирным шрифтом.
// - <a href = "Ссылка"> Строка </a> - добавляет гиперссылку.
// Например, "Минимальная версия программы <b>1.1</b>. <a href = "Обновление">Обновите</a> программу.".
//
// Параметры:
//  СтрокаСТегами - Строка - строка, содержащая теги форматирования.
//
// Возвращаемое значение:
//  ФорматированнаяСтрока - преобразованная строка.
//
Функция ФорматированнаяСтрока(Знач СтрокаСТегами) Экспорт
	
	СтрокиСВыделением = Новый СписокЗначений;
	Пока СтрНайти(СтрокаСТегами, "<b>") <> 0 Цикл
		НачалоВыделения = СтрНайти(СтрокаСТегами, "<b>");
		СтрокаДоОткрывающегоТега = Лев(СтрокаСТегами, НачалоВыделения - 1);
		СтрокиСВыделением.Добавить(СтрокаДоОткрывающегоТега);
		СтрокаПослеОткрывающегоТега = Сред(СтрокаСТегами, НачалоВыделения + 3);
		КонецВыделения = СтрНайти(СтрокаПослеОткрывающегоТега, "</b>");
		ВыделенныйФрагмент = Лев(СтрокаПослеОткрывающегоТега, КонецВыделения - 1);
		СтрокиСВыделением.Добавить(ВыделенныйФрагмент,, Истина);
		СтрокаПослеВыделения = Сред(СтрокаПослеОткрывающегоТега, КонецВыделения + 4);
		СтрокаСТегами = СтрокаПослеВыделения;
	КонецЦикла;
	СтрокиСВыделением.Добавить(СтрокаСТегами);
	
	СтрокиСоСсылками = Новый СписокЗначений;
	Для Каждого ЧастьСтроки Из СтрокиСВыделением Цикл
		
		СтрокаСТегами = ЧастьСтроки.Значение;
		
		Если ЧастьСтроки.Пометка Тогда
			СтрокиСоСсылками.Добавить(СтрокаСТегами,, Истина);
			Продолжить;
		КонецЕсли;
		
		НачалоВыделения = СтрНайти(СтрокаСТегами, "<a href = ");
		Пока НачалоВыделения <> 0 Цикл
			СтрокаДоОткрывающегоТега = Лев(СтрокаСТегами, НачалоВыделения - 1);
			СтрокиСоСсылками.Добавить(СтрокаДоОткрывающегоТега, );
			
			СтрокаПослеОткрывающегоТега = Сред(СтрокаСТегами, НачалоВыделения + 9);
			ЗакрывающийТег = СтрНайти(СтрокаПослеОткрывающегоТега, ">");
			
			Ссылка = СокрЛП(Лев(СтрокаПослеОткрывающегоТега, ЗакрывающийТег - 2));
			Если СтрНачинаетсяС(Ссылка, """") Тогда
				Ссылка = Сред(Ссылка, 2, СтрДлина(Ссылка) - 1);
			КонецЕсли;
			Если СтрЗаканчиваетсяНа(Ссылка, """") Тогда
				Ссылка = Сред(Ссылка, 1, СтрДлина(Ссылка) - 1);
			КонецЕсли;
			
			СтрокаПослеСсылки = Сред(СтрокаПослеОткрывающегоТега, ЗакрывающийТег + 1);
			КонецВыделения = СтрНайти(СтрокаПослеСсылки, "</a>");
			ТекстСсылки = Лев(СтрокаПослеСсылки, КонецВыделения - 1);
			СтрокиСоСсылками.Добавить(ТекстСсылки, Ссылка);
			
			СтрокаПослеВыделения = Сред(СтрокаПослеСсылки, КонецВыделения + 4);
			СтрокаСТегами = СтрокаПослеВыделения;
			
			НачалоВыделения = СтрНайти(СтрокаСТегами, "<a href = ");
		КонецЦикла;
		СтрокиСоСсылками.Добавить(СтрокаСТегами);
		
	КонецЦикла;
	
	МассивСтроки = Новый Массив;
	Для Каждого ЧастьСтроки Из СтрокиСоСсылками Цикл
		
		Если ЧастьСтроки.Пометка Тогда
			МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение, Новый Шрифт(,,Истина))); // АПК:1345 - устаревший код.
		ИначеЕсли Не ПустаяСтрока(ЧастьСтроки.Представление) Тогда
			МассивСтроки.Добавить(Новый ФорматированнаяСтрока(ЧастьСтроки.Значение,,,, ЧастьСтроки.Представление));
		Иначе
			МассивСтроки.Добавить(ЧастьСтроки.Значение);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Новый ФорматированнаяСтрока(МассивСтроки);	// АПК:1356 - можно использовать составную форматированную строку,
														// так как массив строк формируется из переданного в функцию текста.
	
КонецФункции

// Устарела. Следует использовать см. СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка.
//
// ЧислоЦифрамиПредметИсчисленияПрописью(1.5, "минуту,минуты,минут");
// ->СтрокаСЧисломДляЛюбогоЯзыка(";%1 минуту;;%1 минуты;%1 минут;%1 минуты ", Значение);
//
// ЧислоЦифрамиПредметИсчисленияПрописью(1.5, "минуту,минуты,минут ", Ложь);
// ->СтрокаСЧисломДляЛюбогоЯзыка(";минуту;;минуты;минут;минуты", Значение);
//
// Возвращает текстовое представление числа с единицей измерения в правильном склонении и числе.
//
// Параметры:
//  Значение                    - Число  - любое целое число.
//  ПараметрыПредметаИсчисления - Строка - варианты написания единицы измерения для одной,
//                                         для двух и для пяти единиц, разделитель - запятая.
//  ДобавлятьЧислоКРезультату   - Булево - при передаче значения Ложь число не будет добавлено к строке.
//
// Возвращаемое значение:
//  Строка - текстовое представление количества единиц, число записывается цифрами.
//
// Пример:
//  ЧислоЦифрамиПредметИсчисленияПрописью(23,  "минуту,минуты,минут") = "23 минуты";
//  ЧислоЦифрамиПредметИсчисленияПрописью(15,  "минуту,минуты,минут") = "15 минут".
//
Функция ЧислоЦифрамиПредметИсчисленияПрописью(Знач Значение, Знач ПараметрыПредметаИсчисления,
	Знач ДобавлятьЧислоКРезультату = Истина) Экспорт
	
	Результат = ?(ДобавлятьЧислоКРезультату, Формат(Значение, "ЧН=0") + " ", "");
	ПредставленияПредмета = Новый Массив;
	
	ПараметрыПредметаИсчисления = СтрРазделить(ПараметрыПредметаИсчисления, ",");
	Для Каждого Параметр Из ПараметрыПредметаИсчисления Цикл
		ПредставленияПредмета.Добавить(СокрЛП(Параметр));
	КонецЦикла;
	
	Значение = Значение % 100;
	Если Значение > 20 Тогда
		Значение = Значение % 10;
	КонецЕсли;
	
	Индекс = ?(Значение = 1, 0, ?(Значение > 1 И Значение < 5, 1, 2));
	Результат = Результат + ПредставленияПредмета[Индекс];
	
	Возврат Результат;
	
КонецФункции

// Устарела. Следует использовать см. СтроковыеФункцииКлиентСервер.СтрокаСЧисломДляЛюбогоЯзыка.
//
// ФормаМножественногоЧисла("минуту", "минуты", "минут", 1.5);
// -> СтрокаСЧисломДляЛюбогоЯзыка(";минуту;;минуты;минут;минуты", Значение);
//
// Возвращает единицу измерения в нужном склонении в зависимости от количества единиц.
//
// Параметры: 
//  ФормаДля1 - Строка - форма слова для одной единицы;
//  ФормаДля2 - Строка - форма слова для двух единиц;
//  ФормаДля5 - Строка - форма слова для пяти единиц;
//  Значение  - Число  - любое целое число.
//
// Возвращаемое значение:
//  Строка - единица изменения в нужном склонении.
//
// Пример:
//  СтроковыеФункцииКлиентСервер.ФормаМножественногоЧисла("шкаф", "шкафа", "шкафов", 3); возвращает "шкафа".
//
Функция ФормаМножественногоЧисла(ФормаДля1, ФормаДля2, ФормаДля5, Знач Значение) Экспорт
	Возврат ЧислоЦифрамиПредметИсчисленияПрописью(Значение, ФормаДля1 + "," + ФормаДля2 + "," + ФормаДля5, Ложь);
КонецФункции

// Устарела. Следует использовать см. СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке
// Проверяет, содержит ли строка только символы кириллического алфавита.
//
// Параметры:
//  СтрокаПроверки - Строка - проверяемая строка.
//  УчитыватьРазделителиСлов - Булево - учитывать ли разделители слов или они являются исключением.
//  ДопустимыеСимволы - Строка - дополнительные разрешенные символы, кроме кириллицы.
//
// Возвращаемое значение:
//  Булево - Истина, если строка содержит только кириллические (или допустимые) символы или пустая;
//           Ложь, если строка содержит иные символы.
//
Функция ТолькоКириллицаВСтроке(Знач СтрокаПроверки, Знач УчитыватьРазделителиСлов = Истина, ДопустимыеСимволы = "") Экспорт
	
	Если ТипЗнч(СтрокаПроверки) <> Тип("Строка") Тогда
		Возврат Ложь;
	КонецЕсли;
	
	Если НЕ ЗначениеЗаполнено(СтрокаПроверки) Тогда
		Возврат Истина;
	КонецЕсли;
	
	КодыДопустимыхСимволов = Новый Массив;
	КодыДопустимыхСимволов.Добавить(1105); // "ё"
	КодыДопустимыхСимволов.Добавить(1025); // "Ё"
	
	Для Индекс = 1 По СтрДлина(ДопустимыеСимволы) Цикл
		КодыДопустимыхСимволов.Добавить(КодСимвола(Сред(ДопустимыеСимволы, Индекс, 1)));
	КонецЦикла;
	
	Для Индекс = 1 По СтрДлина(СтрокаПроверки) Цикл
		КодСимвола = КодСимвола(Сред(СтрокаПроверки, Индекс, 1));
		Если ((КодСимвола < 1040) Или (КодСимвола > 1103)) 
			И (КодыДопустимыхСимволов.Найти(КодСимвола) = Неопределено) 
			И Не (Не УчитыватьРазделителиСлов И ЭтоРазделительСлов(КодСимвола)) Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

// Устарела. Следует использовать см. СтроковыеФункции.СтрокаЛатиницей
// или см. СтроковыеФункцииКлиент.СтрокаЛатиницей.
// 
// Преобразует исходную строку в транслит.
// Может использоваться для отправки SMS-сообщений латиницей или для сохранения
// файлов и папок, чтобы обеспечить возможность их переноса между разными операционными системами.
// Обратное преобразование из латинских символов не предусмотрено.
//
// Параметры:
//  Значение - Строка - произвольная строка.
//
// Возвращаемое значение:
//  Строка - строка, в которой кириллица заменена на транслит.
//
Функция СтрокаЛатиницей(Знач Значение) Экспорт
	
	Результат = "";
	
	Соответствие = Новый Соответствие;
	СтандартныеПодсистемыКлиентСерверЛокализация.ПриЗаполненииПравилТранслитерации(Соответствие);
	
	ТолькоЗаглавныеВСтроке = ТолькоЗаглавныеВСтроке(Значение);
	
	Для Позиция = 1 По СтрДлина(Значение) Цикл
		Символ = Сред(Значение, Позиция, 1);
		СимволЛатиницей = Соответствие[НРег(Символ)]; // Поиск соответствия без учета регистра.
		Если СимволЛатиницей = Неопределено Тогда
			// Другие символы остаются "как есть".
			СимволЛатиницей = Символ;
		Иначе
			Если ТолькоЗаглавныеВСтроке Тогда 
				СимволЛатиницей = ВРег(СимволЛатиницей); // восстанавливаем регистр
			ИначеЕсли Символ = ВРег(Символ) Тогда
				СимволЛатиницей = ТРег(СимволЛатиницей); // восстанавливаем регистр
			КонецЕсли;
		КонецЕсли;
		Результат = Результат + СимволЛатиницей;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ФорматированнаяСтрока

Функция СформироватьФорматированнуюСтроку(ШаблонСтроки, ЭлементыСтиля,
		Знач Параметр1, Знач Параметр2, Знач Параметр3, Знач Параметр4, Знач Параметр5) Экспорт
	
	ПараметрыСтроки = Новый Массив;
	ПараметрыСтроки.Добавить(Параметр1);
	ПараметрыСтроки.Добавить(Параметр2);
	ПараметрыСтроки.Добавить(Параметр3);
	ПараметрыСтроки.Добавить(Параметр4);
	ПараметрыСтроки.Добавить(Параметр5);
	
	HTMLСтрока = ?(ПараметрыСтроки.Количество() > 0,
		ПодставитьПараметрыВСтрокуИзМассива(ШаблонСтроки, ПараметрыСтроки), ШаблонСтроки);
	
	НаборСтрок = Новый Массив;
	
	ТекущийШрифт  = Неопределено;
	ТекущийЦвет   = Неопределено;
	ТекущийФон    = Неопределено;
	ТекущаяСсылка = Неопределено;
	
	ФрагментыСтроки = СтрРазделить(HTMLСтрока, "<", Истина);
	
	ИменаТэгов = Новый Соответствие;
	ИменаТэгов.Вставить("SPAN", Истина);
	ИменаТэгов.Вставить("IMG",  Истина);
	ИменаТэгов.Вставить("B",    Истина);
	ИменаТэгов.Вставить("A",    Истина);
	
	СимволНачалаФрагмента = "";
	Для каждого Фрагмент Из ФрагментыСтроки Цикл
		
		ТелоСтроки = "";
		ПозицияКонецТэга = СтрНайти(Фрагмент, ">");
		
		Если ПозицияКонецТэга = 0 Тогда
			ТелоСтроки = СимволНачалаФрагмента + Фрагмент;
			
		ИначеЕсли СтрНачинаетсяС(Фрагмент, "/") Тогда
			
			ИмяТега = Сред(Фрагмент, 2, ПозицияКонецТэга - 2);
			
			Если ИменаТэгов.Получить(ВРег(ИмяТега)) = Истина Тогда 
				ТелоСтроки    = Сред(Фрагмент, ПозицияКонецТэга + 1);
				ТекущийШрифт  = Неопределено;
				ТекущийЦвет   = Неопределено;
				ТекущийФон    = Неопределено;
				ТекущаяСсылка = Неопределено;
			Иначе
				ТелоСтроки = СимволНачалаФрагмента + Фрагмент;
			КонецЕсли;
			
		Иначе
			
			ОписаниеТэга = Лев(Фрагмент, ПозицияКонецТэга - 1);
			ПервыйПробел = СтрНайти(ОписаниеТэга, " ");
			
			Если ПервыйПробел > 0 Тогда
				ИмяТега = СокрЛП(Лев(ОписаниеТэга, ПервыйПробел));
				
				ОписаниеАтрибутов = Сред(ОписаниеТэга, ПервыйПробел + 1);
				ОписаниеАтрибутов = СтрЗаменить(ОписаниеАтрибутов , """", "'");
				
				ПозицияРавно = СтрНайти(ОписаниеАтрибутов, "=");
				Пока ПозицияРавно > 0 Цикл
					
					ИмяАтрибута = СокрЛП(Лев(ОписаниеАтрибутов, ПозицияРавно - 1));
					ПозицияПерваяКавычка = СтрНайти(ОписаниеАтрибутов, "'",, ПозицияРавно + 1);
					Если ПозицияПерваяКавычка = 0 Тогда
						ПозицияПерваяКавычка = ПозицияРавно;
					КонецЕсли;
					ПозицияВтораяКавычка = СтрНайти(ОписаниеАтрибутов, "'",, ПозицияПерваяКавычка + 1);
					Если ПозицияВтораяКавычка = 0 Тогда
						ПозицияВтораяКавычка = СтрДлина(ОписаниеАтрибутов) + 1;
					КонецЕсли;
					ЗначениеАтрибута = СокрЛП(Сред(ОписаниеАтрибутов, ПозицияПерваяКавычка + 1,  ПозицияВтораяКавычка - ПозицияПерваяКавычка - 1));
					
					Если СтрСравнить(ИмяАтрибута, "style") = 0 И ЗначениеЗаполнено(ЗначениеАтрибута) Тогда
						УстановитьСтилиПоЗначениюАтрибута(ЗначениеАтрибута, ЭлементыСтиля, ТекущийФон, ТекущийЦвет, ТекущийШрифт);
					ИначеЕсли СтрСравнить(ИмяАтрибута, "href") = 0 И СтрСравнить(ИмяТега, "a") = 0 Тогда
						ТекущаяСсылка = ЗначениеАтрибута;
					ИначеЕсли СтрСравнить(ИмяАтрибута, "src") = 0 И СтрСравнить(ИмяТега, "img") = 0 Тогда
						НаборСтрок.Добавить(ФорматированнаяСтрокаБезИзмененияРазмераШрифта(Новый ФорматированнаяСтрока(БиблиотекаКартинок[ЗначениеАтрибута], ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка)));
					КонецЕсли;
					
					ОписаниеАтрибутов = Сред(ОписаниеАтрибутов, ПозицияВтораяКавычка + 1);
					ПозицияРавно = СтрНайти(ОписаниеАтрибутов, "=");
					
				КонецЦикла;
			Иначе
				ИмяТега = ОписаниеТэга;
			КонецЕсли;
			
			Если ИменаТэгов.Получить(ВРег(ИмяТега)) = Истина Тогда
				
				Если ВРег(ИмяТега) = "B" Тогда
					ТекущийШрифт = ЭлементыСтиля["ВажнаяНадписьШрифт"];
				КонецЕсли;
				
				ТелоСтроки = Сред(Фрагмент, ПозицияКонецТэга + 1);
			Иначе
				ТелоСтроки = СимволНачалаФрагмента + Фрагмент;
			КонецЕсли;
			
		КонецЕсли;
		
		ТелоСтроки = СтрЗаменить(ТелоСтроки, "&lt;", "<");
		Если СтрДлина(ТелоСтроки) > 0 Тогда
			НаборСтрок.Добавить(ФорматированнаяСтрокаБезИзмененияРазмераШрифта(Новый ФорматированнаяСтрока(ТелоСтроки, ТекущийШрифт, ТекущийЦвет, ТекущийФон, ТекущаяСсылка)));
		КонецЕсли; 
		
		СимволНачалаФрагмента = "<" ;
		
	КонецЦикла;
	
	Возврат Новый ФорматированнаяСтрока(НаборСтрок);	// АПК:1356 - можно использовать составную форматированную строку,
														// так как массив строк формируется из переданного в функцию текста.

КонецФункции

Процедура УстановитьСтилиПоЗначениюАтрибута(Знач ОписаниеСтиля, ЭлементыСтиля, ТекущийФон, ТекущийЦвет, ТекущийШрифт)
	
	Стили = СтрРазделить(ОписаниеСтиля, ";");
	
	Для каждого Стиль Из Стили Цикл
		
		ЗначенияСтиля = СтрРазделить(стиль, ":");
		ИмяСтиля      = СокрЛП(ЗначенияСтиля[0]);
		ЗначениеСтиля = СокрЛП(ЗначенияСтиля[1]);
		
		Если СтрСравнить(ИмяСтиля, "color") = 0  Тогда
			ТекущийЦвет = ЭлементыСтиля[ЗначениеСтиля];
		ИначеЕсли СтрСравнить(ИмяСтиля, "background-color") = 0 Тогда
			ТекущийФон = ЭлементыСтиля[ЗначениеСтиля];
		ИначеЕсли СтрСравнить(ИмяСтиля, "font") = 0 Тогда
			ТекущийШрифт = ЭлементыСтиля[ЗначениеСтиля];
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Функция ФорматированнаяСтрокаБезИзмененияРазмераШрифта(Строка)
	ФорматированныйДокумент = Новый ФорматированныйДокумент;
	ФорматированныйДокумент.УстановитьФорматированнуюСтроку(Строка);
	Возврат ФорматированныйДокумент.ПолучитьФорматированнуюСтроку();
КонецФункции

#КонецОбласти

#Область ПреобразоватьЧислоВРимскуюНотацию

// Выполняет преобразование цифры в римскую нотацию. 
//
// Параметры:
//  Цифра - Число - цифра от 0 до 9.
//  РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка - Строка - символы, соответствующие римским цифрам.
//
// Возвращаемое значение
//  Строка - цифра в римской нотации.
//
// Пример: 
//	СтроковыеФункцииКлиентСервер.ПреобразоватьЦифруВРимскуюНотацию(7,"I","V","X") = "VII".
//
Функция ПреобразоватьЦифруВРимскуюНотацию(Цифра, РимскаяЕдиница, РимскаяПятерка, РимскаяДесятка)
	
	РимскаяЦифра="";
	Если Цифра = 1 Тогда
		РимскаяЦифра = РимскаяЕдиница
	ИначеЕсли Цифра = 2 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 3 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 4 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяПятерка;
	ИначеЕсли Цифра = 5 Тогда
		РимскаяЦифра = РимскаяПятерка;
	ИначеЕсли Цифра = 6 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница;
	ИначеЕсли Цифра = 7 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 8 Тогда
		РимскаяЦифра = РимскаяПятерка + РимскаяЕдиница + РимскаяЕдиница + РимскаяЕдиница;
	ИначеЕсли Цифра = 9 Тогда
		РимскаяЦифра = РимскаяЕдиница + РимскаяДесятка;
	КонецЕсли;
	Возврат РимскаяЦифра;
	
КонецФункции

#КонецОбласти

#Область ПодставитьПараметрыВСтроку

// Вставляет параметры в строку, учитывая, что в параметрах могут использоваться подстановочные слова %1, %2 и т.д.
Функция ПодставитьПараметрыСПроцентом(Знач СтрокаПодстановки,
	Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
	Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
	Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено)
	
	Результат = "";
	Позиция = СтрНайти(СтрокаПодстановки, "%");
	Пока Позиция > 0 Цикл 
		Результат = Результат + Лев(СтрокаПодстановки, Позиция - 1);
		СимволПослеПроцента = Сред(СтрокаПодстановки, Позиция + 1, 1);
		ПодставляемыйПараметр = Неопределено;
		Если СимволПослеПроцента = "1" Тогда
			ПодставляемыйПараметр = Параметр1;
		ИначеЕсли СимволПослеПроцента = "2" Тогда
			ПодставляемыйПараметр = Параметр2;
		ИначеЕсли СимволПослеПроцента = "3" Тогда
			ПодставляемыйПараметр = Параметр3;
		ИначеЕсли СимволПослеПроцента = "4" Тогда
			ПодставляемыйПараметр = Параметр4;
		ИначеЕсли СимволПослеПроцента = "5" Тогда
			ПодставляемыйПараметр = Параметр5;
		ИначеЕсли СимволПослеПроцента = "6" Тогда
			ПодставляемыйПараметр = Параметр6;
		ИначеЕсли СимволПослеПроцента = "7" Тогда
			ПодставляемыйПараметр = Параметр7
		ИначеЕсли СимволПослеПроцента = "8" Тогда
			ПодставляемыйПараметр = Параметр8;
		ИначеЕсли СимволПослеПроцента = "9" Тогда
			ПодставляемыйПараметр = Параметр9;
		КонецЕсли;
		Если ПодставляемыйПараметр = Неопределено Тогда
			Результат = Результат + "%";
			СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 1);
		Иначе
			Результат = Результат + ПодставляемыйПараметр;
			СтрокаПодстановки = Сред(СтрокаПодстановки, Позиция + 2);
		КонецЕсли;
		Позиция = СтрНайти(СтрокаПодстановки, "%");
	КонецЦикла;
	Результат = Результат + СтрокаПодстановки;
	
	Возврат Результат;
КонецФункции

#КонецОбласти

#Область СтрокаЛатиницей

Функция ТолькоЗаглавныеВСтроке(Значение)
	
	Для Позиция = 1 По СтрДлина(Значение) Цикл
		Символ = Сред(Значение, Позиция, 1);
		Если Символ <> ВРег(Символ) Тогда 
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

#КонецОбласти

#КонецОбласти
